home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / include / zebra.h < prev    next >
C/C++ Source or Header  |  1992-09-25  |  4KB  |  146 lines

  1. /*
  2.  * zebra.h --
  3.  *
  4.  *    General definitions for the Zebra file system.
  5.  *
  6.  * Copyright 1992 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that this copyright
  10.  * notice appears in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  *
  15.  * $Header: /sprite/lib/forms/RCS/proto.h,v 1.8 92/03/02 15:32:57 bmiller Exp $ SPRITE (Berkeley)
  16.  */
  17.  
  18. #ifndef _ZEBRA
  19. #define _ZEBRA
  20.  
  21. #include <list.h>
  22.  
  23. /*
  24.  * Stripe Identifier.  This is used to uniquely identify stripes.
  25.  * Format of an SID:
  26.  *
  27.  * -------------------------------------------------------------------
  28.  * |  31 - 24     |                    23 - 4               | 3 - 0  |
  29.  * |  Host #      |                  Sequence #             | Unused |
  30.  * -------------------------------------------------------------------
  31.  */
  32.  
  33. typedef unsigned int Zebra_Sid; 
  34.  
  35. #define ZEBRA_SID_HOST_BITS 8
  36. #define ZEBRA_SID_HOST_SHIFT 24
  37.  
  38. #define ZEBRA_SID_SEQ_BITS 20
  39. #define ZEBRA_SID_SEQ_SHIFT 4
  40.  
  41. /* 
  42.  * Macro to create an SID given a host # and a sequence #.
  43.  */
  44.  
  45. #define Zebra_SidCreate(host, sequence)                     \
  46.     ((((host) & ((1 << ZEBRA_SID_HOST_BITS) - 1)) << ZEBRA_SID_HOST_SHIFT) | \
  47.     (((sequence) & ((1 << ZEBRA_SID_SEQ_BITS) - 1)) << ZEBRA_SID_SEQ_SHIFT))
  48.  
  49. /* 
  50.  * Macro to compare two SIDs. Returns 0 if they are equal, 1 otherwise.
  51.  */
  52.  
  53. #define Zebra_SidCmp(sid1, sid2) ((sid1) != (sid2))
  54.  
  55. /* 
  56.  * Stripe Fragment Identifier. Uniquely identifies a stripe fragment. The
  57.  * format is the same as an SID, except that the low bits encode the
  58.  * ID of the storage server that stores the fragment.
  59.  */
  60.  
  61. typedef Zebra_Sid Zebra_Sfid;
  62.  
  63. #define ZEBRA_SFID_SERVER_BITS 4
  64.  
  65. /*
  66.  * Maximum number of storage servers that can store a stripe. 
  67.  */
  68.  
  69. #define ZEBRA_MAX_STORAGE_SERVERS (1 << ZEBRA_SFID_SERVER_BITS)
  70.  
  71. /* 
  72.  * Macro to create an SFID from an SID and a storage server ID.
  73.  */
  74.  
  75. #define Zebra_SfidCreate(sid, server)                     \
  76.     ((server) & ((1 << ZEBRA_SFID_SERVER_BITS) - 1) | (sid))
  77.  
  78.  
  79. /*
  80.  * Zebra Checksum. This is used to validate various data structures such
  81.  * as the fragments.
  82.  */
  83.  
  84. typedef unsigned int Zebra_Checksum;
  85.  
  86. /*
  87.  * Zebra Timestamp. 
  88.  */
  89.  
  90. typedef unsigned int Zebra_TimeStamp;
  91.  
  92. /*
  93.  * A unique id.
  94.  */
  95.  
  96. typedef unsigned int Zebra_Uid;
  97.  
  98. /*
  99.  * This structure is used to store information about each Zebra domain.
  100.  * The metaInfo is used to find the correct domainInfo based upon
  101.  * a metadata file handle. The volumes is an array of information
  102.  * on the storage servers for the domain. Each element in the array
  103.  * contains a storage server ID and a volume ID. 
  104.  */
  105. typedef struct {
  106.     List_Links    links;                /* Used to make lists. */
  107.     int     serverID;            /* Server for metadata. */
  108.     int        domainID;            /* ID of the domain. */
  109.     int        numServers;            /* Number of storage servers
  110.                          * for the domain. */
  111.     int        fragSize;            /* Stripe fragment size
  112.                          * (in KBytes). */
  113.     struct {
  114.     int        serverID;        /* Storage server ID. */
  115.     Zebra_Uid    vid;            /* Volume ID. */
  116.     } volumes[ZEBRA_MAX_STORAGE_SERVERS];
  117. } Zebra_DomainInfo;
  118.  
  119. /*
  120.  * Header for a Zebra metadata file.
  121.  */
  122.  
  123. typedef struct {
  124.     int        magic;        /* Magic number. See below. */
  125.     int        blocks;        /* Number of blocks in the file. */
  126.     char    pad[8];        /* Pad this out to 16 bytes so metadata
  127.                  * elements don't span file blocks. */
  128. } Zebra_MetadataHdr;
  129.  
  130. #define ZEBRA_METADATA_HDR_MAGIC        0xdeadcafe
  131.  
  132. /*
  133.  * These structures follow the header in the metadata file. There is
  134.  * one structure per block in the Zebra file.
  135.  */
  136.  
  137. typedef struct {
  138.     int        serverID;    /* Storage server ID. */
  139.     Zebra_Uid    vid;        /* Volume ID. */
  140.     Zebra_Sfid    sfid;        /* Stripe fragment ID. */
  141.     int        offset;        /* Offset within stripe fragment. */
  142. } Zebra_Metadata;
  143.  
  144. #endif /* _ZEBRA */
  145.  
  146.